home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / taropyon / hewin / ccisrc / tdpwhlp.cci < prev    next >
Text File  |  1993-11-30  |  5KB  |  196 lines

  1. /*************************************************************************
  2. *    ワードヘルプ
  3. *************************************************************************/
  4.  
  5. char    WdHlpPath[128];
  6. char    WdHlpFn[128];
  7. char    WdHlpIdxFn[128];
  8.  
  9. #define    WDHLP_KEY_LEN    (16)
  10.  
  11. int        WdHelp( char *name )
  12. {
  13.     int        ch, i, ret;
  14.     char    *fp, *idxFp;
  15.     char    *s, buf[BUFSIZ];
  16.     char    key[WDHLP_KEY_LEN+4];
  17.     long    fpos;
  18.     int        x0, y0;
  19.     char    *dlg;
  20.     char    *txtPtr;
  21.  
  22.     x0 = y0 = DLGPOS_CENTER_OF_SCN;
  23.     txtPtr = NULL;
  24.     DSP_writePage(1);
  25.     if ( WdHlpPath[0] == '\0' )
  26.         strcpy( WdHlpPath, AplGetStartPath() );
  27.     sprintf( WdHlpFn   , "%sTdpHelp.whf", WdHlpPath );
  28.     sprintf( WdHlpIdxFn, "%sTdpHelp.whi", WdHlpPath );
  29.  
  30.     if ( (fp = FM_fopen(WdHlpFn,"rb")) == NULL )
  31.     {
  32.         DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
  33.             C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
  34.             3, " %s : \n  File open error!! ", WdHlpFn );
  35.         return (ERR);
  36.     }
  37.  
  38.     if ( (idxFp = FM_fopen(WdHlpIdxFn,"rb")) == NULL )
  39.     {
  40.         /* インデックファイルの作成    */
  41.  
  42.         dlg = DLG_msgOpen(x0,y0, 8*40,16*8, C_MBLACK,C_DLGBASE,C_HGREEN,
  43.             "MAKE INDEX FILE for WORD HELP" );
  44.         if ( dlg == NULL )
  45.         {
  46.             FM_fclose(fp);
  47.             return (ERR);
  48.         }
  49.         DLG_msgClear( dlg, -1 );
  50.         DLG_msgPrintf(dlg,"インデックスファイルを作成します。\r\n" );
  51.  
  52.         if ( (idxFp = FM_fopen(WdHlpIdxFn,"wb")) == NULL )
  53.         {
  54.             DLG_msgPrintf(dlg,"File open errro!! (%s)\r\n", WdHlpIdxFn );
  55.             DLG_msgClose(dlg);
  56.             FM_fclose(fp);
  57.             return (ERR);
  58.         }
  59.  
  60.         for (;;)
  61.         {
  62.             fpos = ftell(fp);
  63.             if ( fgets(buf,BUFSIZ,fp) == NULL )
  64.                 break;
  65.             s = buf;
  66.             if ( *s != '.' )
  67.                 continue;
  68.             ++s;
  69.             while ( isspace(*s) )
  70.                 ++s;
  71.             memset( key, '\0', 17 );
  72.             for ( i = 0; i < WDHLP_KEY_LEN; ++i )
  73.             {
  74.                 ch = *s;    ++s;
  75.                 if ( isdigit(ch) == 0 && isalpha(ch) == 0 && ch != '_' )
  76.                     break;
  77.                 key[i] = ch;
  78.             }
  79.             if ( key[0] == '\0' )
  80.                 continue;
  81.             DLG_msgPrintf(dlg,"fpos = %6ld : %s\r\n", fpos, key );
  82.             fwrite(&fpos,            4,1,idxFp);
  83.             fwrite(  key,WDHLP_KEY_LEN,1,idxFp);
  84.         }
  85.         DLG_msgClose(dlg);
  86.         FM_fclose(idxFp);
  87.         if ( (idxFp = FM_fopen(WdHlpIdxFn,"rb")) == NULL )
  88.         {
  89.             FM_fclose(fp);
  90.             return (ERR);
  91.         }
  92.     }
  93.  
  94.     ret = 0;
  95.     for(;;)
  96.     {
  97.         if ( fread(&fpos,4,1,idxFp) < 1 )    /* ファイル位置情報    */
  98.         {
  99.             ret = -1;
  100.             break;
  101.         }
  102.         if ( fread(key,WDHLP_KEY_LEN,1,idxFp) < 1 )    /* キーネーム    */
  103.         {
  104.             ret = -1;
  105.             break;
  106.         }
  107.         if ( strncmp( name, key, WDHLP_KEY_LEN) == 0 )
  108.             break;
  109.     }
  110.     FM_fclose(idxFp);
  111.     if ( ret )
  112.     {    /* 指定の検索パターンはない    */
  113.         DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
  114.             C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
  115.             3, "  %s : \n  Pattern not found!! ", name );
  116.         FM_fclose(fp);
  117.         return (ERR);
  118.     }
  119.     fseek(fp,fpos,SEEK_SET);
  120.     fgets(buf,BUFSIZ,fp);    /* read header line */
  121.     while ( fgets(buf,BUFSIZ,fp) != NULL )
  122.     {
  123.         if ( buf[0] == '.' )
  124.             break;
  125.         txtPtr = DLG_txtSetLinBuf( txtPtr, 8, 80, "%s", buf );
  126.     }
  127.     FM_fclose(fp);
  128.  
  129.     if ( (dlg = DLG_txtOpen(x0,y0,80,20,txtPtr,0)) == NULL )
  130.     {
  131.         DLG_txtFreeLinBuf( txtPtr );
  132.         return (ERR);
  133.     }
  134.     DLG_txtSetTitle( dlg, "TDP WORD HELP" );
  135.     DLG_txtSetGuideMsg( dlg, "Function : %s", name );
  136.     DLG_txtStart( dlg );
  137.     DLG_txtClose( dlg );
  138.     DLG_txtFreeLinBuf( txtPtr );
  139.  
  140.     return (NORMAL);
  141. }
  142.  
  143. /*************************************************************************
  144. *    カーソル位置の単語の説明を見る
  145. *************************************************************************/
  146.  
  147. int        TxdUsr_word_help( char *txd )
  148. {
  149.     int        ret, ch, len;
  150.     char    word[WDHLP_KEY_LEN+4];
  151.     size_t    curLnL, curOfs;
  152.     char    *dlg;
  153.  
  154.     if ( TxdGet_selFlag(txd) != 0 )        /* 選択中なら処理しない    */
  155.         return (0);
  156.  
  157.     /* 現在カーソル位置を取得    */
  158.     curLnL = TxdGet_curPosLnL(txd);
  159.     curOfs = TxdGet_curPosOfs(txd);
  160.  
  161.     if ( (ch = TXD_getch(txd)) > 0 && ch < 256 && (isalpha(ch) || ch == '_') )
  162.     {
  163.         len = 0;
  164.         while( len < WDHLP_KEY_LEN )
  165.         {
  166.             ch = TXD_getch(txd);
  167.             TXD_cmdJump( txd, TXD_CUR_RIGHT );
  168.             if ( isalpha(ch) || ch == '_' )
  169.             {
  170.                 word[len++] = ch;
  171.             } else
  172.                 break;
  173.         }
  174.         word[len] = '\0';
  175.         TXD_jumpPos( txd, curLnL, curOfs );
  176.         if ( len == 0 )
  177.             return (NORMAL);
  178.     } else
  179.         word[0] = '\0';
  180.  
  181.     DSP_writePage(1);
  182.     dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
  183.         "検索パターンを入力してください。" );
  184.     DLG_getsSetTitle( dlg, "PATTERN" );
  185.     ret = DLG_getsStart( dlg, WDHLP_KEY_LEN, word );
  186.     DLG_getsClose(dlg);
  187.     if ( ret <= 0 )
  188.         return (0);
  189.  
  190.     WdHelp( word );
  191.  
  192.     return (0);
  193. }
  194.  
  195. #undef    WDHLP_KEY_LEN
  196.